/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tools;

public class Timer {
    /* Classe Timer 
     * Usado para tratamento de tempo em nano-segundos */
    
    /* Variaveis */
    private long startTicks; // contagem no momento que foi iniciado/retomado
    private long pausedTicks;// contagem no momento que pausou
    private boolean started; // se foi iniciado
    private boolean paused;  // se esta pausado

    public Timer() {
        started = false;
        paused = false;
        
        startTicks = 0L;
        pausedTicks = 0L;
    }
    
    public void start()
    {
        /* Iniciar */
        started = true;
        startTicks = System.nanoTime(); // Pega tempo inicial
    }
    public void pause()
    {
        /* Pausar */
        if(started) // Se nao foi iniciado nao tem como pausar
        {
            if(!paused) // se ja está pausado nao tem como pausar
            {
                paused = true;
                pausedTicks = System.nanoTime() - startTicks; // pega o tempo no momento da pausa
            }
        }
    }
    public void unpause()
    {
        /* Despausar */
        if(started) // se nao foi iniciado nao está pausado, entao nao tem como despausar
        {
            if(paused) // se nao está pausado nao tem como despausar
            {
                paused = false;
                startTicks = System.nanoTime() - pausedTicks; // retira do tempo atual o 
                                                              // tempo que ja tinha passado
            }
        }
    }
    public void stop()
    {
        /* Parar */
        /* So e necessario mudar as variaveis de pausado e iniciado para
         * falso, assim ele esta parado e retornara 0 independente dos tempos
         * inicial e pausado */
        started = false;
        paused = false;
    }
    public long getTime()
    {
        /* Pegar tempo atual */
        if(started) // se esta rodando calculamos o tempo atual...
        {
            if(!paused) // se nao esta parado continuamos o cauculo
            {
                return System.nanoTime() - startTicks;
            }
            return pausedTicks; // se esta pausado retornamos o tempo de pausa, ja calculado
        }
        return 0L; // ... se nao, ou seja, esta parado, retornamos 0
    }
    public boolean hasStarted()
    {
        /* retorna true se tiver iniciado */
        return started;
    }
    public boolean isPaused()
    {
        /* retorna true se tiver pausado */
        return paused;
    }
}
